#itertools提供了非常有用的用于操作迭代对象的函数。
import itertools
natuals = itertools.count(1)
for n in natuals:
    if n < 1000:
        print(n)

#cycle()会把传入的一个序列无限重复下去
import itertools
cs = itertools.cycle('ABC')
p = 0
for c in cs:
    if p < 1000:
        print(c)
        p += 1

#repeat()负责把一个元素无限重复下去，不过如果提供第二个参数就可以限定重复次数：
ns = itertools.repeat('A', 3)
for n in ns:
    print(n)

#我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列
import itertools
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 10, natuals)
print(list(ns))

#chain()可以把一组迭代对象串联起来，形成一个更大的迭代器
for c in itertools.chain('ABC', 'XYZ'):
        print(c)

#groupby()把迭代器中相邻的重复元素挑出来放在一起
for key, group in itertools.groupby('AAABBBCCAAA'):
    print(key, list(group))

#如果我们要忽略大小写分组，就可以让元素'A'和'a'都返回相同的key
for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):
    print(key, list(group))

#计算圆周率
def pi(N):
    cc = itertools.count(1, 2)
    List = []
    for c in cc:
        l = len(List)
        if l >= N:
            break
        List.append(4 * pow(-1, l) / c)   
    return sum(List)
    return 3.14